- 跟着三元大佬做的一款网易云音乐的 WebApp(三元大佬电子书链接:https://sanyuan0704.github.io/react-cloud-music/)
- 主要技术栈:react hooks + redux + immutable.js + rem
- 这一章主要讲
Recommend组件的开发,涉及UI方面的轮播图、列表,react项目性能优化。
轮播组件开发
Slider组件测试与使用
在 src/application/Recommend/index.js 中,写入如下代码:
1 | import React from 'react'; |
我们在这里导入了我们的轮播图组件 Slider 并使用了它,当然这个组件我们还没写。
我们创建了一个数组 bannerList,用来模拟获取的数据,通过属性的方式传递给了 Slider 组件。
然后我们去 src/components 下新建一个 slilder 目录及其 index.js 文件夹:
1 | import React from 'react'; |
上面我们通过对象解构的方式获得了传递过来的数据 bannerList,然后使用这个数据创建了四个 img 标签,此时启动服务,在 Recommend 中可以看见四张图,如此我们的 Slider 组件可以正常使用。下面我们开始真正地编写一个轮播图组件吧。
使用 swiper 插件制作轮播图
安装 swiper 并使用 react Hooks
首先安装 swiper 插件:
1 | $ npm install swiper --save |
在 index.js 中引入安装的 swiper 插件:
1 | import React,{ useEffect, useState } from 'react'; |
这个项目是使用 react Hooks 进行开发的,所以我们同时引入了 react Hooks 开发必备的 useEffect 和 useState。
先利用 react Hooks 改写我们的组件:
1 | import React, { useEffect, useState } from 'react'; |
上面的代码就是通过 react Hooks 的方法改写的。
const [sliderSwiper, setSliderSwiper] = useState(null) 在 react Hooks 中用来定义变量。
上面我们定义了变量 sliderSwiper,我们会通过 setSliderSwiper 来修改变量 sliderSwiper,这里的 setSliderSwiper 不需要我们自己写方法,它被自动定义,类似setState。useState(null) 的参数是定义的 sliderSwiper 的初始值,这里我们把初始值设定为空。
其中 useEffect 是类似于 componentDidMount 和 componentDidUpdate 的函数,会在组件第一次挂载或更新时被调用,理所当然的,我们一般会在这里优化我们的渲染。下面我们会用到。
使用 swiper
useEffect 的第一个参数是一个方法。第二个参数是一个数组,数组中可以写入很多状态对应的变量。
当不写第二个参数时,每次状态发生变化,都会执行内部方法,包括 mount 和 update。
传入值时,当值发生变化时,我们才会执行内部方法。
当传空数组 [] 时,只会在组件 mount 时执行内部方法。
先看看 swiper 插件的使用结构,大家可以查阅 swiper 的 api:我们在 react Hooks 中这样写:
1 | const [sliderSwiper, setSliderSwiper] = useState(null); |
上面的 bannerList 是我们接收的图片数据,sliderSwiper 是我们定义的一个变量,通过 setSliderSwiper 对 sliderSwiper 进行修改,这正是 react Hooks 的语法。我们把 new Swiper 写在 useEffect 里面,给 useEffect 的第二个参数传入两个值:bannerList.length 和 sliderSwiper,除了挂载时(mount),只有当bannerList.length 或 sliderSwiper 变化(update)时才执行 useEffect 的内部方法。
所以,现在我们的 index.js 文件就变成了:
1 | import React, { useEffect, useState } from 'react'; |
我们现在就可以看到轮播图的效果了,不过现在轮播图的样式还有问题,所以我们调节一下轮播图的样式。
调节 swiper 样式
因为整个 swiper 都放在了外面的样式组件 SliderContainer 中,所以去 style.js 中写样式吧:
首先导入文件:
1 | import styled from 'styled-components'; |
定义 SliderContainer 的整体样式:
1 | export const SliderContainer = styled.div` |
定义 slider-container 的样式:
1 | export const SliderContainer = styled.div` |
overflow 很重要!!!
定义分页器导航样式:
1 | export const SliderContainer = styled.div` |
就是换了一个颜色……
然后发现图片背后还应该有个背景,外面在 SliderContainer 里面添加一个 div:<div className="before"></div>,则现在的 SliderContainer 是:
1 | <SliderContainer> |
总结
components/slider/index.js:
1 | import React, { useEffect, useState } from 'react'; |
components/slider/style.js:
1 | import styled from 'styled-components'; |
推荐列表的开发
RecommendList 组件测试与使用
在 recommend 组件中,导入 List 组件:
1 | import List from '../../components/list'; |
使用 List 组件:
1 | return ( |
然后我们去 src/components 下新建一个 list 文件夹及其 index.js 文件夹:
1 | import React from 'react'; |
如你所见,因为这里没有涉及到业务,所以使用的是无状态组件。
现在启动服务就可以看见我们获取到的数据了。
RecommendList 组件样式布局
既然已经可以拿到数据了,就开始做样式和布局吧。同样的在当前目录下创建 style.js,在里面写样式组件并在 index.js 中导入:
1 | import { |
使用:
1 | <ListWrapper> |
上面我分了三个样式组件,首先是整体的 ListWraper,头部 ListTitle,然后是 List,它包含众多的 ListItem,每一个 ListItem 都是一份数据。
对此的样式 style.js 是:
1 | import styled from 'styled-components'; |
然后在做 ListItem 的布局样式:
index.js:
1 | <ListItem key={item.id}> |
styles.js:
1 | export const ListItem = styled.div` |
封装工具函数
如今已经可以看到样式了,但是有一个小细节:听过人数现在不好看,最好能用带单位的方式呈现,所以我们要封装一个用来计算的函数,我们在 src/api 下面新建一个 utils.js 文件,里面放这个工具函数:
1 | export const getCount = (count) => { |
然后在 index.js 中引用它:
1 | import { getCount } from "../../api/utils"; |
使用它进行计算:
1 | <span className="count">{getCount(item.playCount)}</span> |
小细节
在 ListItem 中 img 标签的上方,有个这个:<div className="decorate"></div>
对应的 style.js 样式:
1 | .decorate { |
三元大佬原文:它的作用就是给给图片上的图标和文字提供一个遮罩,因为在字体颜色是白色,在面对白色图片背景的时候,文字会看不清或者看不到,因此提供一个阴影来衬托出文字,这个细节很容易被忽略, 希望大家也能注意一下。
这个细节很到位啊,这里就提升了用户体验,学到了。
总结
components/list/index.js:
1 | import React from 'react'; |
components/list/style.js:
1 | import styled from 'styled-components'; |